package com.aaa.config;


import com.aaa.filter.TokenFilter;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import reactor.core.publisher.Mono;

import java.util.stream.Collectors;

@Configuration
public class GatewayConfig {


    /***
     * 这定义了每个用户10的请求速率限制。允许20个突发，但是下一秒只有10个请求可用。
     * KeyResolver是一个简单的参数，它获取user请求参数（注意：不建议在生产中使用）。
     * @return
     */
    @Bean
    KeyResolver userKeyResolver() {
        //  ip地址限流 exchange.getRequest().getRemoteAddress().getHostString()
        //  可以通过请求设定限流exchange.getRequest().getPath().toString()
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostString());
    }

    @Bean
    public GlobalFilter tokenFilter() {
        return new TokenFilter();
    }

    /***
     * Spring Cloud Gateway 是基于 WebFlux 的，是 ReactiveWeb，所以 HttpMessageConverters 不会自动注入。
     * 于是自己在配置文件中，直接复制源码的 Bean
     * @param converters
     * @return
     */
    @Bean
    @ConditionalOnMissingBean
    public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
        return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
    }


}
